/**
 * Framework Tec - Autobus.java
 *
 * @author Abdessamad HAILASS
 * @since 2011
 **/

package tec;

class Autobus implements Transport, Bus {
   private JaugeNaturel Assis;
   private JaugeNaturel Debouts;
   
   private int Arret;
   
   private java.util.Vector <Passager> Passagers;

   public Autobus (int nbPlaceAssise, int nbPlaceDebout) {
      Passagers = new java.util.Vector <Passager> (nbPlaceDebout + nbPlaceAssise);
      Debouts = new JaugeNaturel (0, nbPlaceDebout, 0);
      Assis = new JaugeNaturel (0, nbPlaceAssise, 0);
      Arret = 0;
   }

   // Indique au tranport de simuler l'arret suivant.
   public void allerArretSuivant () {
      Arret ++;
      for (Passager p: Passagers) {
         p.nouvelArret (this, Arret);
      }
   }

   // Vrai s'il existe des places assises.
   public boolean aPlaceAssise () {
      return ! Assis.estRouge ();
   }

   // Vrai s'il existe des places debouts.
   public boolean aPlaceDebout () {
      return ! Debouts.estRouge ();
   }

   // Change un passager d'une place debout vers une place assise.
   public void demanderChangerEnAssis(Passager p) {
      Debouts.decrementer ();
      Assis.incrementer ();
      p.accepterPlaceAssise ();
   }
    
   // Change un passager d'une place assise vers une place debout.   
   public void demanderChangerEnDebout(Passager p) {
      Assis.decrementer ();
      Debouts.incrementer ();
      p.accepterPlaceDebout();
   }
    
   // Le passager entre dans ce bus en demandant une place assise. 
   public void demanderPlaceAssise(Passager p) {
      if (aPlaceAssise ()) {
         Assis.incrementer ();
         p.accepterPlaceAssise ();
         ajouterPassager (p);
            
      } else {
         throw new java.lang.IllegalArgumentException ("Le bus n'a plus de place Assise.");
      }
   }
    
   // Le passager entre dans ce bus en demandant une place debout.
   public void demanderPlaceDebout (Passager p) throws java.lang.IllegalArgumentException {
      if (aPlaceDebout ()) {
         Debouts.incrementer ();
         p.accepterPlaceDebout();
         ajouterPassager (p);
         
      } else {
         throw new java.lang.IllegalArgumentException ("Le bus n'a plus de place Debout.");
      }
   }
    
   // Fait sortir un passager du bus.
   public void demanderSortie (Passager p) throws java.lang.IllegalArgumentException {
      if (Passagers.contains (p)) {
         if (p.estDebout ()) {
            Debouts.decrementer ();
            p.accepterSortie ();
            Passagers.removeElement (p);            
            
         } else if (p.estAssis ()) {
            Assis.decrementer ();
            p.accepterSortie ();
            Passagers.removeElement (p);
         }
         
      } else {
         throw new java.lang.IllegalArgumentException
            ("L'usager \"" + p.toString () + "\" n'est pas passager du Bus.");
      }
   }
   
   // Ajoute un Passager au Bus.
   public void ajouterPassager (Passager p) throws java.lang.IllegalArgumentException {
      if (Passagers.contains (p)) {
         throw new java.lang.IllegalArgumentException
            ("L'usager \"" + p.toString () + "\" est deja passager du Bus.");
      }
      
      if (Passagers.size () < Passagers.capacity ()) {
         Passagers.addElement (p);
         
      } else {
         throw new java.lang.IllegalArgumentException
            ("Le Bus a atteint sa capacitee maximale.");
      }
   }
}

